/**
 * Notes: 用户数据信息
 * User: darcy
 * Author: 252452324@qq.com
 * Date: 2024/10/26
 * Time: 17:57
 * Version:v2.2
 */

import Client from "@/utils/client";


export default class User {
	private _storeKey : string

	/**
	 * 初始化构造函数
	 * @param key 存取用户信息的key
	 */
	constructor(key : string = '') {
		this._storeKey = key || 'user-OAuth2-info-data'

		//触发异步检查Token 是否过期
		this.isExpires().catch(error => { console.error('User Error in isExpires:', error); });
	}

	/**
	 * 存储用户信息
	 * @param data 需在存储的数据
	 */
	set(data : any) : void {
		uni.setStorage({
			key: this._storeKey,
			data: data,
			success: function () {
			}
		});
	}

	/**
	 * 获取用户信息
	 * @param name 获取用户信息相应对象下标的值
	 */
	get(name ?: string) : Record<string, string | null> | string | null {
		let userData = uni.getStorageSync(this._storeKey) || null;

		if (userData !== null) {
			let expiresTime = userData.tokenExpires || null;
			if (this.isUserTokenExpires(expiresTime)) {
				// 移除存储的用户数据
				this.remove()
				userData = null;
			}
		}

		//如果提供了name参数，返回指定字段的值（字符串类型）或null
		if (name !== undefined && name !== '') {
			return userData?.[name] || null
		}

		return {
			userId: userData?.userId || null, //用户ID
			avatar: userData?.avatar || null, //用户头像
			nicename: userData?.nicename || null, //用户昵称
			mobile: userData?.mobile || null, //用户手机号码
			token: userData?.token || '', //用户token
			removeAt: userData?.removeAt || null, //注销时间 标准时间
		}
	}

	/**
	 * 移除用户数据
	 */
	remove() : void {
		uni.removeStorageSync(this._storeKey)
	}
	
	/**
	 * 判断用户信息是否过期
	 * @return true:已过期  false:未过期
	 */
	async isExpires() : Promise<boolean> {
		const token = this.get('token');
		if (token === null) return true;

		const _userExpiresKey = '_userExpiresKey_';
		let myDate = new Date();
		let day = myDate.getDate();
		const storedDay = uni.getStorageSync(_userExpiresKey);

		if (day === storedDay) {
			return false; // 如果今天已经验证过，则直接返回 false
		}

		const isState = await this.fetchRequest(); // 等待 fetchRequest 的结果

		if (isState) {
			uni.removeStorageSync(_userExpiresKey);
		} else {
			uni.setStorageSync(_userExpiresKey, day);
		}

		return isState;
	}
	
	/**
	 * 异位请求判断 Token 是否过期
	 */
	private async fetchRequest() : Promise<boolean> {
		let isState = false
		try {
			const client = new Client();
			const response = await client.request({
				data: { methodCode: 'v1.user.istokenexpires' },
				isShowToast: false,
				method: 'GET',
				timeout: 2
			});

			const isToken = response?.data?.expires || '';
			const _is = isToken != null;
			
			if (!_is) {
				this.remove();
				isState = true;
			}

		} catch (error) {
			console.error('Error fetching request:', error);
		}

		return isState
	}

	/**
	 * 用户的Token是否已经过期时间
	 */
	private isUserTokenExpires(expiresTime ?: number) : boolean {
		const timestamp = Math.floor(Date.now() / 1000); // 获取当前时间戳（秒）  

		// 检查expiresTime是否存在且不为null，并且当前时间戳是否大于过期时间戳  
		return expiresTime !== undefined && expiresTime !== null && timestamp > expiresTime;
	}
}